/**
  **************************************************************************
  * File   : board.c
  **************************************************************************
  */

#include "board.h"
#include "stdio.h"
#include "SPIM.h"

static gpio_init_cfg_type gpio_cfg[] = 
{
	//KEY
    {GPIOC, GPIO_Mode_IN_PU, GPIO_MaxSpeed_50MHz, 0, GPIO_Pins_13 | GPIO_Pins_14 | GPIO_Pins_15}, //key
    {GPIOB, GPIO_Mode_IN_PU, GPIO_MaxSpeed_50MHz, 0, GPIO_Pins_3 | GPIO_Pins_4 | GPIO_Pins_5}, //key
    {GPIOA, GPIO_Mode_IN_PU, GPIO_MaxSpeed_50MHz, 0, GPIO_Pins_15 | GPIO_Pins_12}, //key
	
	//UART
	{GPIOA, GPIO_Mode_OUT_PP, GPIO_MaxSpeed_50MHz, 0, GPIO_Pins_11}, //u1-DE
    {GPIOA, GPIO_Mode_AF_PP, GPIO_MaxSpeed_50MHz, 0, GPIO_Pins_9},  //u1-TX
    {GPIOA, GPIO_Mode_IN_PU, GPIO_MaxSpeed_50MHz, 0, GPIO_Pins_10},  //u1-RX
	
	//CAN
	{GPIOB, GPIO_Mode_AF_PP, GPIO_MaxSpeed_50MHz, 0, GPIO_Pins_9},  //TX
    {GPIOB, GPIO_Mode_IN_PU, GPIO_MaxSpeed_50MHz, 0, GPIO_Pins_8},  //RX
	
	//LCD
	{GPIOA, GPIO_Mode_OUT_PP, GPIO_MaxSpeed_50MHz, 1, GPIO_Pins_0 | GPIO_Pins_1 | GPIO_Pins_2 | GPIO_Pins_3},
	{GPIOA, GPIO_Mode_OUT_PP, GPIO_MaxSpeed_50MHz, 1, GPIO_Pins_4 | GPIO_Pins_5 | GPIO_Pins_6 | GPIO_Pins_7},
	{GPIOB, GPIO_Mode_OUT_PP, GPIO_MaxSpeed_50MHz, 0, GPIO_Pins_0}, //RST
	{GPIOB, GPIO_Mode_OUT_PP, GPIO_MaxSpeed_50MHz, 1, GPIO_Pins_12 | GPIO_Pins_13 | GPIO_Pins_14 | GPIO_Pins_15},
	{GPIOB, GPIO_Mode_OUT_PP, GPIO_MaxSpeed_50MHz, 1, GPIO_Pins_2},
};

/**
  * @brief  Board initialize interface 
  * @param  None
  * @retval None
  */
void board_init()
{
    int index;
    GPIO_InitType GPIO_InitStructure;
    
    /*clk enable*/
    RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_WWDG, ENABLE);
    
    RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_AFIO, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOB, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOC, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOD, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOF, ENABLE);
    
    RCC_AHBPeriphClockCmd(RCC_AHBPERIPH_DMA1, ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPERIPH_DMA2, ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPERIPH_CRC, ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPERIPH_FLASH, ENABLE);
    
    /*swd*/
    GPIO_PinsRemapConfig(AFIO_MAP7_SWJTAG_0010, ENABLE);
    
    /*gpio cfg*/

    for(index=0; index < sizeof(gpio_cfg)/sizeof(gpio_init_cfg_type);index++)
    {
        GPIO_InitStructure.GPIO_Mode = gpio_cfg[index].mode;
        GPIO_InitStructure.GPIO_MaxSpeed = gpio_cfg[index].speed;
        GPIO_InitStructure.GPIO_Pins = gpio_cfg[index].pin;
        GPIO_Init(gpio_cfg[index].port, &GPIO_InitStructure);
        
        if((gpio_cfg[index].mode == GPIO_Mode_OUT_OD) || (gpio_cfg[index].mode == GPIO_Mode_OUT_PP))
        {
            if(gpio_cfg[index].val_init)
            {
                GPIO_SetBits(gpio_cfg[index].port, gpio_cfg[index].pin);
            }
            else
            {
                GPIO_ResetBits(gpio_cfg[index].port, gpio_cfg[index].pin);
            }
        }
    }
   
}
